package com.example.leetcode.hash;


import java.util.*;

/**
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * <p>
 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
 * <p>
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
 * <p>
 * 意思就是 只要组成字母相同的单词就被分到同一组里。
 */
public class GroupAnagrams {

    public static void main(String[] args) {
        String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"};

        GroupAnagrams groupAnagrams = new GroupAnagrams();
        List<List<String>> lists = groupAnagrams.groupAnagrams(strs);
        System.out.println(lists);
    }
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.equals("")) {
            return Collections.emptyList();
        }

        Map<String, List<String>> table = new HashMap<>();
        for (String str : strs) {
            // 当前字符串转字符数组
            char[] charArray = str.toCharArray();
            // 排序
            Arrays.sort(charArray);
            // 重新转字符串
            String key = new String(charArray);

            // 从hash表获取key相同的集合
            List<String> list = table.getOrDefault(key, new ArrayList<>());
            // 给集合添加元素
            list.add(str);

            // 字符串相同的集合放到一起
            table.put(key, list);
        }

        return new ArrayList<>(table.values());
    }

}
